﻿using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Forms;
using static 摸鱼._数据库;
using static 摸鱼._数据库._方案;
using static 摸鱼._数据库._方案._步骤;
using static 摸鱼.全局类;
using static 摸鱼.核心._数据;
using TreeView = System.Windows.Controls.TreeView;

namespace 摸鱼
{
    public static class UI刷新
    {
        public static void 检查全局参数()
        {
            Dictionary<CS, _参数> new参数 = new();
            new参数.Addparam(CS.开始键, "开始快捷键：{0}", "PageUp");
            new参数.Addparam(CS.结束键, "结束快捷键：{0}", "Next");
            new参数.Addparam(CS.截图键, "截图快捷键：{0}", "Insert");
            new参数.Addparam(CS.隐藏键, "隐藏快捷键：{0}", "End");
            new参数.Addparam(CS.全局音量, "音量：{0}", "0.8");
            new参数.Addparam(CS.框选目标, "框选目标 = {0}", "0");
            new参数.Addparam(CS.maxThreadCount, "线程上限 = {0}", "30");
            //new参数.Addparam(CS.前景色, "主题颜色 = {0}", "#FF1BE0D2");
            new参数.Addparam(CS.初始启动方案, "初始启动方案 = {0}", "方案a,方案b");
            数据库.参数 = new参数.Upparam(数据库.参数);

            if (Enum.TryParse(数据库.参数[CS.开始键].结果值, out Keys result))
                数据库.开始快捷键 = new() { { result, default } };
            if (Enum.TryParse(数据库.参数[CS.结束键].结果值, out result))
                数据库.结束快捷键 = new() { { result, default } };
            if (Enum.TryParse(数据库.参数[CS.隐藏键].结果值, out result))
                数据库.隐藏快捷键 = new() { { result, default } };
            if (Enum.TryParse(数据库.参数[CS.截图键].结果值, out result))
                数据库.截图快捷键 = new() { { result, default } };

        }
        public static void 检查方案参数(_数据库._方案 方案)
        {
            Dictionary<CS, _参数> new参数 = new();
            new参数.Addparam(CS.线程锁, "不响应结束键 = {0}", "0");
            方案.参数 = new参数.Upparam(方案.参数);
        }
        public static void 检查步骤参数(_数据库._方案._步骤 步骤)
        {
            Dictionary<CS, _参数> new参数 = new();
            new参数.Addparam(CS.异步, "异步执行 = {0}", "0");
            步骤.参数 = new参数.Upparam(步骤.参数);
        }

        [SkipLocalsInit]
        [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
        public static void 检查方法参数(_数据库._方案._步骤._方法 方法)
        {
            Dictionary<CS, _参数> new参数 = new();
            switch (方法.名字)
            {
                case "模板找图":
                    new参数.Addparam(CS.图片1, "要找的图片 = {0}", "图片?");
                    new参数.Addparam(CS.坐标, "{0} = 目标位置", "变量?");
                    new参数.Addparam(CS.目标区域, "{0} = 目标区域", "变量?");
                    new参数.Addparam(CS.相似度1, "全局相似度：{0}", "0.8");
                    new参数.Addparam(CS.H, "色相差：{0}", "0.99");
                    new参数.Addparam(CS.S, "饱和度：{0}", "0.95");
                    new参数.Addparam(CS.V, "明亮度：{0}", "0.90");
                    new参数.Addparam(CS.区域, "找图区域 = {0}", "0,0,1920,1080");
                    new参数.Addparam(CS.坐标2, "寻找离 {0} 最近的图", "100,100");
                    new参数.Addparam(CS.找所有图, "找所有图 = {0}", "0");
                    new参数.Addparam(CS.图片压缩, "图片压缩：{0} 倍", "0");
                    new参数.Addparam(CS.识图线程数量, "并行线程 = {0}", "2");
                    new参数.Addparam(CS.布尔值, "取反 = {0}", "0");
                    new参数.Addparam(CS.说明, "找到则执行子方法,\n" +
                                                    "HSV设为0等于找灰度图", "");
                    break;
                case "变化监控":
                    new参数.Addparam(CS.区域, "监控区域 = {0}", "500,300,700,400");
                    new参数.Addparam(CS.相似度1, "若变化幅度 > {0}", "0.2");
                    new参数.Addparam(CS.说明, "则执行子方法", "");
                    new参数.Addparam(CS.坐标, "{0} = 变化位置", "变量?");
                    new参数.Addparam(CS.目标区域, "{0} = 变化区域", "变量?");
                    new参数.Addparam(CS.找图限时, "监控时长 = {0} ms", "0");
                    new参数.Addparam(CS.图片压缩, "图片压缩：{0} 倍", "0");
                    new参数.Addparam(CS.识图帧数, "识图帧数：{0} 帧", "20");
                    break;
                case "图片录制拼接":
                    new参数.Addparam(CS.坐标, "中心点 = {0}", "500,300");
                    new参数.Addparam(CS.半径, "录制半径 = {0}", "200");
                    new参数.Addparam(CS.数字1, "抠图半径 = {0}", "50");
                    new参数.Addparam(CS.图片1, "{0} = 拼接图片", "变量?");
                    new参数.Addparam(CS.相似度1, "匹配识别精度 = {0} ms", "0.98");
                    new参数.Addparam(CS.识图帧数, "最小录制间隔 = {0} ms", "5");
                    new参数.Addparam(CS.区域2, "图片显示位置 = {0}", "50,50,200,200");
                    new参数.Addparam(CS.键盘按键, "录制结束键 = ", "F9");
                    break;
                case "图片录制拼接a":
                    new参数.Addparam(CS.区域, "录制区域 = {0}", "500,300,700,400");
                    new参数.Addparam(CS.图片1, "{0} = 拼接图片", "变量?");
                    new参数.Addparam(CS.图片1, "导航特征点 = {0}", "图片?");
                    new参数.Addparam(CS.H, "色相差：{0}", "0.99");
                    new参数.Addparam(CS.S, "饱和度：{0}", "0.95");
                    new参数.Addparam(CS.V, "明亮度：{0}", "0.90");
                    new参数.Addparam(CS.数字1, "边缘膨胀相连 = {0}", "1");
                    new参数.Addparam(CS.识图帧数, "最小录制间隔 = {0} ms", "5");
                    new参数.Addparam(CS.区域2, "图片显示位置 = {0}", "50,50,200,200");
                    new参数.Addparam(CS.键盘按键, "录制结束键 = ", "F9");
                    break;
                case "取色":
                    new参数.Addparam(CS.图片1, "纯色图片 = {0}", "图片?");
                    new参数.Addparam(CS.区域, "取色位置 = {0}", "0,0,1,1");
                    new参数.Addparam(CS.相似度1, "相似度 = {0}", "0.99");
                    new参数.Addparam(CS.说明, "匹配成功则执行子方法", "");
                    new参数.Addparam(CS.布尔值, "取反 = {0}", "0");
                    break;
                case "特征匹配":
                    new参数.Addparam(CS.图片1, "图片 = {0}", "图片?");
                    new参数.Addparam(CS.相似度1, "相似度 = {0}", "0.9");
                    new参数.Addparam(CS.坐标, "{0} = 目标位置", "变量?");
                    new参数.Addparam(CS.目标区域, "{0} = 目标区域", "变量?");
                    new参数.Addparam(CS.区域, "找图区域 = {0}", "0,0,1920,1080");
                    new参数.Addparam(CS.找所有图, "找所有图 = {0}", "0");
                    new参数.Addparam(CS.数字1, "忽略小于 {0} 的孤立点", "3");
                    new参数.Addparam(CS.坐标2, "找距离 {0} 最近的目标", "100,100");
                    new参数.Addparam(CS.图片压缩, "图片压缩：{0} 倍", "0");
                    new参数.Addparam(CS.布尔值, "取反 = {0}", "0");
                    new参数.Addparam(CS.特征检测器, "特征检测器 = {0}", "SIFT");
                    new参数.Addparam(CS.说明, "找到则执行子方法,\n" +
                                              "此方法是找灰度图,\n" +
                                              "特征检测器:\n" +
                                              "SIFT|ORB|BRISK", "");
                    break;
                case "找色块":
                    new参数.Addparam(CS.图片1, "色块图 = {0}", "图片?");
                    new参数.Addparam(CS.坐标, "{0} = 目标位置", "变量?");
                    new参数.Addparam(CS.目标区域, "{0} = 目标区域", "变量?");
                    new参数.Addparam(CS.面积精度, "面积差：{0}", "0.8");
                    new参数.Addparam(CS.H, "色相差：{0}", "0.99");
                    new参数.Addparam(CS.S, "饱和度：{0}", "0.95");
                    new参数.Addparam(CS.V, "明亮度：{0}", "0.90");
                    new参数.Addparam(CS.区域, "找色区域 = {0}", "0,0,1920,1080");
                    new参数.Addparam(CS.坐标2, "寻找离 {0} 最近的色块", "100,100");
                    new参数.Addparam(CS.图片压缩, "图片压缩：{0} 倍", "0");
                    new参数.Addparam(CS.数字1, "边缘膨胀相连 = {0}", "1");
                    new参数.Addparam(CS.布尔值, "取反 = {0}", "0");
                    new参数.Addparam(CS.说明, "找到则执行子方法,", "");
                    break;
                case "找单色":
                    new参数.Addparam(CS.图片1, "纯色图片 = {0}", "图片?");
                    new参数.Addparam(CS.H, "色相差：{0}", "0.99");
                    new参数.Addparam(CS.S, "饱和度：{0}", "0.95");
                    new参数.Addparam(CS.V, "明亮度：{0}", "0.90");
                    new参数.Addparam(CS.色块1面积, "颜色面积 > {0}", "0");
                    new参数.Addparam(CS.坐标, "{0} = 返回坐标", "变量?");
                    new参数.Addparam(CS.目标区域, "{0} = 目标区域", "变量?");
                    new参数.Addparam(CS.图片压缩, "图片压缩：{0} 倍", "0");
                    new参数.Addparam(CS.区域, "找色区域 = {0}", "0,0,1920,1080");
                    new参数.Addparam(CS.坐标2, "寻找离 {0} 最近的颜色", "100,100");
                    new参数.Addparam(CS.找所有色, "找所有颜色 = {0}", "0");
                    new参数.Addparam(CS.布尔值, "取反 = {0}", "0");
                    new参数.Addparam(CS.说明, "找到则执行子方法", "");
                    break;
                case "SVM二分类训练":
                    new参数.Addparam(CS.图片1, "正样本 = {0}", "图片?");
                    new参数.Addparam(CS.图片2, "负样本 = {0}", "图片?");
                    new参数.Addparam(CS.说明, "该功能暂未实现", "");
                    break;
                case "SVM二分类检测":
                    new参数.Addparam(CS.相似度1, "检测精度 = {0}", "0.99");
                    new参数.Addparam(CS.变量1, "{0} = 目标坐标", "变量?");
                    new参数.Addparam(CS.说明, "找到则执行子方法", "");
                    new参数.Addparam(CS.说明, "该功能暂未实现", "");
                    break;
                case "误差验证":
                    new参数.Addparam(CS.变量1, "数值1 = {0}", "变量?");
                    new参数.Addparam(CS.变量2, "数值2 = {0}", "变量?");
                    new参数.Addparam(CS.相似度1, "误差精度 = {0}", "0.95");
                    new参数.Addparam(CS.说明, "若两个数值的误差在精度范围内,\n则执行子方法", "");
                    break;
                case "距离计算":
                    new参数.Addparam(CS.变量1, "坐标1 = {0}", "变量?");
                    new参数.Addparam(CS.变量2, "坐标2 = {0}", "变量?");
                    new参数.Addparam(CS.代码, "若距离 {0}", "< 10");
                    new参数.Addparam(CS.说明, "则执行子方法", "");
                    break;
                case "ch_OCR":
                    new参数.Addparam(CS.区域, "屏幕区域 = {0}", "1786,1038,1879,1079");
                    new参数.Addparam(CS.相似度1, "是文字概率 > {0}", "0.8");
                    new参数.Addparam(CS.变量1, "则 {0} = 识别结果", "0");
                    new参数.Addparam(CS.说明, "则执行子方法", "");
                    break;
                case "ch_OCR_a":
                    new参数.Addparam(CS.区域, "屏幕区域 = {0}", "1786,1038,1879,1079");
                    new参数.Addparam(CS.相似度1, "是文字概率 > {0}", "0.8");
                    new参数.Addparam(CS.变量1, "则 {0} = 识别结果", "0");
                    new参数.Addparam(CS.说明, "并且执行子方法", "");
                    new参数.Addparam(CS.方案返回值, "能识别多行文本", "");
                    break;
                case "en_OCR":
                    new参数.Addparam(CS.区域, "屏幕区域 = {0}", "1786,1038,1879,1079");
                    new参数.Addparam(CS.相似度1, "是文字概率 > {0}", "0.8");
                    new参数.Addparam(CS.变量1, "则 {0} = 识别结果", "0");
                    new参数.Addparam(CS.说明, "则执行子方法", "");
                    new参数.Addparam(CS.方案返回值, "能识别多行文本", "");
                    break;
                case "en_OCR_a":
                    new参数.Addparam(CS.区域, "屏幕区域 = {0}", "1786,1038,1879,1079");
                    new参数.Addparam(CS.相似度1, "是文字概率 > {0}", "0.8");
                    new参数.Addparam(CS.变量1, "则 {0} = 识别结果", "0");
                    new参数.Addparam(CS.说明, "并且执行子方法", "");
                    new参数.Addparam(CS.方案返回值, "能识别多行文本", "");
                    break;
                case "左击" or "右击":
                    new参数.Addparam(CS.坐标, "目标坐标 = {0}", "变量?");
                    new参数.Addparam(CS.单击次数, "点击：{0} 次", "1");
                    new参数.Addparam(CS.单击间隔, "点击间隔：{0} ms", "100");
                    new参数.Addparam(CS.窗口句柄, "目标窗口句柄 = {0}", "0");
                    break;
                case "左击a" or "右击a":
                    new参数.Addparam(CS.坐标, "目标坐标 = {0}", "变量?");
                    new参数.Addparam(CS.单击次数, "点击次数 = {0}", "1");
                    new参数.Addparam(CS.单击间隔, "点击间隔 = {0} ms", "100");
                    new参数.Addparam(CS.时长, "前摇 = {0} ms", "80");
                    new参数.Addparam(CS.窗口句柄, "目标窗口句柄 = {0}", "0");
                    break;
                case "原地左击" or "原地右击":
                    new参数.Addparam(CS.单击次数, "点击：{0} 次", "1");
                    new参数.Addparam(CS.单击间隔, "点击间隔：{0} ms", "100");
                    new参数.Addparam(CS.窗口句柄, "目标窗口句柄 = {0}", "0");
                    break;
                case "直线移动":
                    new参数.Addparam(CS.坐标, "目标坐标：{0}", "变量?");
                    new参数.Addparam(CS.移动时间, "移动时间：{0} ms", "500");
                    new参数.Addparam(CS.时间, "帧率 = {0} fps", "60");
                    break;
                case "人类鼠标移动":
                    new参数.Addparam(CS.坐标, "目标坐标：{0}", "变量?");
                    new参数.Addparam(CS.半径, "随机定位半径 = {0} px", "5");
                    new参数.Addparam(CS.移动时间, "移动时间：{0} ms", "500");
                    break;
                case "滚轮滑动":
                    new参数.Addparam(CS.鼠标滚轮步长, "滑动步长 = {0}", "-120");
                    new参数.Addparam(CS.单击次数, "滑动次数 = {0}", "1");
                    new参数.Addparam(CS.单击间隔, "滑动间隔 = {0} ms", "30");
                    break;
                case "等待":
                    new参数.Addparam(CS.时长, "等待：{0} ms", "33");
                    break;
                case "等待_偏态分布":
                    new参数.Addparam(CS.数字1, "均值：{0} ms", "55");
                    new参数.Addparam(CS.数字2, "下界：{0} ms", "30");
                    new参数.Addparam(CS.数字3, "上界：{0} ms", "100");
                    new参数.Addparam(CS.数字4, "非均值 > {0}", "0.3");
                    break;
                case "判断":
                    new参数.Addparam(CS.判断变量, "如果 {0}", "变量? > 0");
                    new参数.Addparam(CS.代码, "则 {0}", "0");
                    new参数.Addparam(CS.说明, "并且执行子方法", "");
                    new参数.Addparam(CS.代码2, "否则 {0}", "0");
                    break;
                case "循环":
                    new参数.Addparam(CS.循环变量1, "如果 {0} ", "变量? < 10");
                    new参数.Addparam(CS.代码, "则 {0}", "0");
                    new参数.Addparam(CS.说明, "并且循环子方法", "");
                    new参数.Addparam(CS.代码2, "否则 {0}", "0");
                    break;
                case "循环a":
                    new参数.Addparam(CS.代码, "循环子方法", "");
                    break;
                case "限时循环":
                    new参数.Addparam(CS.循环变量1, "{0} ms 内循环子方法", "1000");
                    break;
                case "执行父方法":
                    new参数.Addparam(CS.数字1, "执行上 {0} 层的父方法  ", "1");
                    break;
                case "播放":
                    new参数.Addparam(CS.音源, "文件：{0} ", "普通.wav");
                    new参数.Addparam(CS.音量, "音量：{0}", "0.5");
                    break;
                case "代码":
                    new参数.Addparam(CS.代码, "{0}", "变量? = 0");
                    break;
                case "相对移动1":
                    new参数.Addparam(CS.相对坐标, "坐标：{0}", "变量?");
                    new参数.Addparam(CS.相对距离, "偏移：{0}", "100,100");
                    new参数.Addparam(CS.移动时间, "移动时间：{0} ms", "500");
                    new参数.Addparam(CS.时间, "帧率 = {0} fps", "20");
                    new参数.Addparam(CS.说明, "用绝对移动模拟相对移动", "");
                    break;
                case "相对移动2":
                    new参数.Addparam(CS.相对距离, "偏移：{0}", "100,100");
                    new参数.Addparam(CS.移动时间, "移动时间：{0} ms", "500");
                    new参数.Addparam(CS.时间, "帧率 = {0} fps", "20");
                    new参数.Addparam(CS.说明, "真相对移动, 注意这会临时关闭鼠标加速\n" +
                                              "因为鼠标加速会影响移动距离", "");
                    break;
                case "相对移动3":
                    new参数.Addparam(CS.相对距离, "偏移：{0}", "100,100");
                    new参数.Addparam(CS.移动时间, "移动时间：{0} ms", "500");
                    new参数.Addparam(CS.时间, "帧率 = {0} fps", "20");
                    new参数.Addparam(CS.说明, "用绝对移动模拟相对移动", "");
                    break;
                case "获取位置":
                    new参数.Addparam(CS.鼠标位置, "{0} = 鼠标位置", "变量?");
                    break;
                case "屏蔽":
                    new参数.Addparam(CS.屏蔽区域, "屏蔽区域：{0}", "变量?");
                    new参数.Addparam(CS.屏蔽时长, "屏蔽时长：{0} ms", "2000");
                    break;
                case "跳转步骤":
                    new参数.Addparam(CS.跳转步骤, "目标步骤：{0}", "1");
                    break;
                case "执行步骤":
                    new参数.Addparam(CS.数字1, "目标步骤 = {0}", "1");
                    new参数.Addparam(CS.变量1, "若返回值 = {0},", "1");
                    new参数.Addparam(CS.说明, "则执行子方法", "");
                    break;
                case "执行多步骤":
                    new参数.Addparam(CS.变量1, "步骤集合 = {0}", "1,2,3");
                    new参数.Addparam(CS.变量2, "{0} = 返回值", "变量?");
                    new参数.Addparam(CS.变量3, "若 {0}", "变量?[0]==1 && 变量?[1]==1 && 变量?[2]==1");
                    new参数.Addparam(CS.说明, "则执行子方法", "");
                    break;
                case "结束步骤":
                    new参数.Addparam(CS.变量1, "返回值 = {0}", "1");
                    break;
                case "跳转并结束":
                    new参数.Addparam(CS.跳转步骤, "目标步骤：{0}", "1");
                    break;
                case "获取鼠标特征码":
                    new参数.Addparam(CS.鼠标特征码1, "{0} = 当前特征码", "变量?");
                    new参数.Addparam(CS.鼠标特征码2, "如果 当前特征码 == {0}", "变量?");
                    new参数.Addparam(CS.说明, "则执行子方法", "");
                    break;
                case "获取窗口句柄":
                    new参数.Addparam(CS.坐标, "窗口位置 = {0}", "0,0");
                    new参数.Addparam(CS.窗口句柄, "{0} = 窗口句柄", "变量?");
                    break;
                case "获取窗口主句柄":
                    new参数.Addparam(CS.坐标, "窗口位置 = {0}", "0,0");
                    new参数.Addparam(CS.窗口句柄, "{0} = 窗口句柄", "变量?");
                    break;
                case "获取当前窗口主句柄":
                    new参数.Addparam(CS.窗口句柄, "{0} = 窗口句柄", "变量?");
                    break;
                case "获取当前窗口句柄":
                    new参数.Addparam(CS.窗口句柄, "{0} = 窗口句柄", "变量?");
                    break;
                case "注册键盘钩子":
                    new参数.Addparam(CS.键盘按键, "注册的按键 = {0}", "按下任意键");
                    new参数.Addparam(CS.持续触发, "持续触发 = {0}", "1");
                    new参数.Addparam(CS.循环变量1, "循环 = {0}", "1");
                    new参数.Addparam(CS.代码, "按键按下时, 执行子方法", "");
                    break;
                case "注册键盘钩子a":
                    new参数.Addparam(CS.键盘按键, "注册的按键 = {0}", "按下任意键");
                    new参数.Addparam(CS.持续触发, "持续触发 = {0}", "1");
                    new参数.Addparam(CS.循环变量1, "循环 = {0}", "1");
                    new参数.Addparam(CS.时长, "若 {0}ms 内按下, 则执行子方法", "10000");
                    new参数.Addparam(CS.布尔值, "并且重新计时 = {0}", "1");
                    new参数.Addparam(CS.代码, "否则 {0}", "0");
                    break;
                case "注册鼠标钩子":
                    new参数.Addparam(CS.鼠标按键, "注册的鼠标按键 = {0}", "按下任意键");
                    new参数.Addparam(CS.持续触发, "持续触发 = {0}", "1");
                    new参数.Addparam(CS.循环变量1, "循环 = {0}", "1");
                    new参数.Addparam(CS.代码, "按键按下时, 执行子方法", "");
                    break;
                case "注册鼠标钩子a":
                    new参数.Addparam(CS.鼠标按键, "注册的鼠标按键 = {0}", "按下任意键");
                    new参数.Addparam(CS.持续触发, "持续触发 = {0}", "1");
                    new参数.Addparam(CS.循环变量1, "循环 = {0}", "1");
                    new参数.Addparam(CS.时长, "若 {0}ms 内按下, 则执行子方法", "10000");
                    new参数.Addparam(CS.布尔值, "并且重新计时 = {0}", "1");
                    new参数.Addparam(CS.代码, "否则 {0}", "0");
                    break;
                case "键盘同步鼠标":
                    new参数.Addparam(CS.鼠标按键, "注册的鼠标按键 = {0}", "按下任意键");
                    new参数.Addparam(CS.键盘按键2, "同步的键盘按键 = {0}", "按下任意键");
                    new参数.Addparam(CS.窗口句柄, "目标窗口句柄 = {0}", "0");
                    new参数.Addparam(CS.代码, "按键按下时,", "");
                    new参数.Addparam(CS.数字1, "循环 {0} 次子方法", "1");
                    new参数.Addparam(CS.布尔值, "否则结束子方法 = {0}", "1");
                    break;
                case "键盘同步键盘":
                    new参数.Addparam(CS.键盘按键, "注册的键盘按键 = {0}", "按下任意键");
                    new参数.Addparam(CS.键盘按键2, "同步的键盘按键 = {0}", "按下任意键");
                    new参数.Addparam(CS.窗口句柄, "目标窗口句柄 = {0}", "0");
                    new参数.Addparam(CS.代码, "按键按下时,", "");
                    new参数.Addparam(CS.数字1, "循环 {0} 次子方法", "1");
                    new参数.Addparam(CS.布尔值, "否则结束子方法 = {0}", "1");
                    break;
                case "按下判断":
                    new参数.Addparam(CS.键盘按键, "按键 = {0}", "按下任意键");
                    new参数.Addparam(CS.代码, "按下时, 执行子方法", "");
                    break;
                case "弹起判断":
                    new参数.Addparam(CS.键盘按键, "按键 = {0}", "按下任意键");
                    new参数.Addparam(CS.代码, "弹起时, 执行子方法", "");
                    break;
                case "鼠标按下判断":
                    new参数.Addparam(CS.鼠标按键, "鼠标按键 = {0}", "按下任意键");
                    new参数.Addparam(CS.代码, "按下时, 执行子方法", "");
                    break;
                case "鼠标弹起判断":
                    new参数.Addparam(CS.鼠标按键, "鼠标按键 = {0}", "按下任意键");
                    new参数.Addparam(CS.代码, "弹起时, 执行子方法", "");
                    break;
                case "创建按钮":
                    new参数.Addparam(CS.文本1, "显示文本 = {0}", "按钮1");
                    new参数.Addparam(CS.前景色, "前景色 = {0}", "50,0,0");
                    new参数.Addparam(CS.背景色, "背景色 = {0}", "255,255,255");
                    new参数.Addparam(CS.字体大小, "字体大小 = {0}", "16");
                    new参数.Addparam(CS.字体, "字体 = {0}", "宋体");
                    new参数.Addparam(CS.字体加粗, "加粗 = {0}", "1");
                    new参数.Addparam(CS.区域, "区域位置 = {0}", "950,480,1150,580");
                    new参数.Addparam(CS.代码, "按钮被点击时, 循环一次子方法", "");
                    break;
                case "创建按钮a":
                    new参数.Addparam(CS.文本1, "显示文本 = {0}", "按钮1");
                    new参数.Addparam(CS.前景色, "前景色 = {0}", "50,0,0");
                    new参数.Addparam(CS.背景色, "背景色 = {0}", "255,255,255");
                    new参数.Addparam(CS.字体大小, "字体大小 = {0}", "16");
                    new参数.Addparam(CS.字体, "字体 = {0}", "宋体");
                    new参数.Addparam(CS.字体加粗, "加粗 = {0}", "1");
                    new参数.Addparam(CS.区域, "区域位置 = {0}", "950,480,1150,580");
                    new参数.Addparam(CS.时长, "{0}ms 后, 隐藏按钮", "1000");
                    new参数.Addparam(CS.代码, "按钮被点击时, 执行\n子方法并隐藏按钮", "");
                    break;
                case "创建标签":
                    new参数.Addparam(CS.文本1, "显示文本 = {0}", "你好");
                    new参数.Addparam(CS.前景色, "前景色 = {0}", "50,0,0");
                    new参数.Addparam(CS.背景色, "背景色 = {0}", "255,255,255");
                    new参数.Addparam(CS.字体大小, "字体大小 = {0}", "16");
                    new参数.Addparam(CS.字体, "字体 = {0}", "宋体");
                    new参数.Addparam(CS.字体加粗, "加粗 = {0}", "1");
                    new参数.Addparam(CS.区域, "区域位置 = {0}", "950,480,1150,580");
                    new参数.Addparam(CS.代码, "子方法结束时, 标签隐藏", "");
                    break;
                case "异步调用方案":
                    new参数.Addparam(CS.调用方案, "调用方案 = {0}", "方案名称");
                    new参数.Addparam(CS.说明, "如: 方案1,方案2,方案3", "");
                    break;
                case "同步调用方案":
                    new参数.Addparam(CS.调用方案, "调用方案 = {0}", "方案名称");
                    new参数.Addparam(CS.方案返回值, "如果返回值 = {0}", "1");
                    new参数.Addparam(CS.说明, "则执行子方法", "");
                    new参数.Addparam(CS.变量1, "{0} = 返回值", "0");
                    break;
                case "结束方案":
                    new参数.Addparam(CS.方案返回值, "返回值 = {0}", "1");
                    break;
                case "获取时间戳":
                    new参数.Addparam(CS.方法返回值, "{0} = 系统时间戳", "变量?");
                    break;
                case "位置回溯":
                    new参数.Addparam(CS.说明, "子方法完成后, 鼠标回到起点", "");
                    break;
                case "传播消息":
                    new参数.Addparam(CS.暗号, "暗号 = {0}", "123");
                    new参数.Addparam(CS.消息, "新消息 = {0}", "1");
                    break;
                case "订阅消息":
                    new参数.Addparam(CS.暗号, "暗号 = {0}", "123");
                    new参数.Addparam(CS.消息, "{0} = 新消息", "变量?");
                    new参数.Addparam(CS.时间, "清空 {0}ms 以前的消息", "1");
                    new参数.Addparam(CS.说明, "收到消息后, 执行子方法", "");
                    new参数.Addparam(CS.循环变量1, "循环 = {0}", "1");
                    break;
                case "订阅变量":
                    new参数.Addparam(CS.变量1, "订阅的变量 = {0}", "变量?");
                    new参数.Addparam(CS.说明, "变量内容变化时, 执行子方法", "");
                    new参数.Addparam(CS.循环变量1, "循环 = {0}", "1");
                    break;
                case "复制变量值":
                    new参数.Addparam(CS.变量1, "剪切板内容 = {0}", "变量?");
                    break;
                case "异步方法":
                    new参数.Addparam(CS.说明, "异步执行子方法", "");
                    break;
                case "获取剪切板内容":
                    new参数.Addparam(CS.变量1, "{0} = 剪切板内容", "变量?");
                    break;
                case "暂停其他方案":
                    new参数.Addparam(CS.调用方案, "要暂停的方案 = {0}", "全部");
                    new参数.Addparam(CS.音源, "文件 = {0} ", "暂停.wav");
                    new参数.Addparam(CS.音量, "音量 = {0}", "0.5");
                    new参数.Addparam(CS.说明, "暂停后, 执行子方法", "");
                    break;
                case "训练":
                    new参数.Addparam(CS.变量1, "训练样本 = {0}", "变量1,变量2,变量3");
                    new参数.Addparam(CS.学习率, "学习率 = {0}", "0.001");
                    new参数.Addparam(CS.层数, "神经网络层数 = {0}", "3");
                    new参数.Addparam(CS.尺寸, "图片缩放尺寸 = {0}", "20");
                    new参数.Addparam(CS.说明, "训练后, 请使用正样本", "");
                    new参数.Addparam(CS.代码, "变量进行检测", "");
                    break;
                case "替换索引":
                    new参数.Addparam(CS.数字1, "索引位置 = {0}", "0");
                    new参数.Addparam(CS.变量1, "新的元素 = {0}", "变量?");
                    new参数.Addparam(CS.变量2, "数组 = {0}", "数组?");
                    break;
                case "替换元素":
                    new参数.Addparam(CS.变量1, "被替换的元素 = {0}", "变量?");
                    new参数.Addparam(CS.变量2, "新的元素 = {0}", "变量?");
                    new参数.Addparam(CS.变量3, "数组 = {0}", "数组?");
                    new参数.Addparam(CS.数字1, "替换第几个 = {0}", "0");
                    break;
                case "删除元素":
                    new参数.Addparam(CS.变量1, "要删除的元素 = {0}", "变量?");
                    new参数.Addparam(CS.变量2, "数组 = {0}", "数组?");
                    new参数.Addparam(CS.数字1, "删除第几个 = {0}", "0");
                    break;
                case "删除索引":
                    new参数.Addparam(CS.数字1, "要删除的索引 = {0}", "0");
                    new参数.Addparam(CS.变量1, "数组 = {0}", "数组?");
                    break;
                case "获取长度":
                    new参数.Addparam(CS.变量1, "{0} = 数组的元素数量", "变量?");
                    new参数.Addparam(CS.变量2, "数组 = {0}", "数组?");
                    break;
                case "添加元素":
                    new参数.Addparam(CS.变量1, "要添加的元素 = {0}", "变量?");
                    new参数.Addparam(CS.变量2, "数组 = {0}", "数组?");
                    break;
                case "插入元素":
                    new参数.Addparam(CS.变量1, "要插入的元素 = {0}", "变量?");
                    new参数.Addparam(CS.数字1, "插入位置 = {0}", "0");
                    new参数.Addparam(CS.变量2, "数组 = {0}", "数组?");
                    break;
                case "目标检测":
                    new参数.Addparam(CS.区域, "要检测的区域 = {0}", "0,0,50,50");
                    new参数.Addparam(CS.相似度1, "相似度 > {0}", "0.5");
                    new参数.Addparam(CS.符合度, "重叠度 < {0}", "0.5");
                    new参数.Addparam(CS.文件, "模型文件 = {0}", "./model/yolov5s.xml");
                    new参数.Addparam(CS.说明, " ", "");
                    new参数.Addparam(CS.变量1, "{0} = ", "变量?");
                    new参数.Addparam(CS.类型1, "类型 {0} 的坐标位置", "0");
                    new参数.Addparam(CS.变量2, "{0} = ", "变量?");
                    new参数.Addparam(CS.类型2, "类型 {0} 的坐标位置", "1");
                    new参数.Addparam(CS.变量3, "{0} = ", "变量?");
                    new参数.Addparam(CS.类型3, "类型 {0} 的坐标位置", "2");
                    new参数.Addparam(CS.判断变量, "  ", "");
                    new参数.Addparam(CS.坐标, "取距离 {0}", "500,500");
                    new参数.Addparam(CS.文本1, "最 {0} 的坐标位置", "近");
                    new参数.Addparam(CS.字体加粗, "   ", "");
                    new参数.Addparam(CS.前景色, "----此方案将持续运行----", "");
                    break;
                case "包含文字":
                    new参数.Addparam(CS.变量1, "文本 = {0}", "变量?");
                    new参数.Addparam(CS.文本1, "如果包含 = {0}", "哈哈");
                    new参数.Addparam(CS.说明, "则执行子方法", "");
                    break;
                case "提取数字":
                    new参数.Addparam(CS.变量1, "文本 = {0}", "变量?");
                    new参数.Addparam(CS.变量2, "{0} = 提取结果", "变量?");
                    new参数.Addparam(CS.布尔值, "忽略小写逗号 = {0}", "1");
                    new参数.Addparam(CS.布尔值2, "忽略大写逗号 = {0}", "0");
                    new参数.Addparam(CS.说明, "遇到非数字时会截断", "");
                    break;
                case "提取数字a":
                    new参数.Addparam(CS.变量1, "文本 = {0}", "变量?");
                    new参数.Addparam(CS.变量2, "{0} = 提取结果", "变量?");
                    new参数.Addparam(CS.说明, "会提取所有数字", "");
                    break;
                case "提取数字b":
                    new参数.Addparam(CS.变量1, "文本 = {0}", "变量?");
                    new参数.Addparam(CS.变量2, "{0} = 提取结果", "变量?");
                    new参数.Addparam(CS.文本1, "分隔符 = {0}", "/");
                    new参数.Addparam(CS.布尔值, "忽略小写逗号 = {0}", "1");
                    new参数.Addparam(CS.布尔值2, "忽略大写逗号 = {0}", "0");
                    new参数.Addparam(CS.方案返回值, "遇到分隔符时, 会转换成数组", "");
                    new参数.Addparam(CS.说明, "遇到非数字时会截断", "");
                    break;
                case "提取数字c":
                    new参数.Addparam(CS.变量1, "文本 = {0}", "变量?");
                    new参数.Addparam(CS.变量2, "{0} = 提取结果", "变量?");
                    new参数.Addparam(CS.文本1, "分隔符 = {0}", "/");
                    new参数.Addparam(CS.方案返回值, "遇到分隔符时, 会转换成数组", "");
                    new参数.Addparam(CS.说明, "会提取所有数字", "");
                    break;
                case "截取文字":
                    new参数.Addparam(CS.变量1, "文本 = {0}", "变量?");
                    new参数.Addparam(CS.数字1, "开始位置 = {0}", "0");
                    new参数.Addparam(CS.数字2, "截取长度 = {0}", "5");
                    new参数.Addparam(CS.变量2, "{0} = 截取的文本", "变量?");
                    break;
                case "四舍五入":
                    new参数.Addparam(CS.变量1, "数值 = {0}", "变量?");
                    new参数.Addparam(CS.变量2, "{0} = 结果", "变量?");
                    break;
                case "向上取整":
                    new参数.Addparam(CS.变量1, "数值 = {0}", "变量?");
                    new参数.Addparam(CS.变量2, "{0} = 结果", "变量?");
                    break;
                case "向下取整":
                    new参数.Addparam(CS.变量1, "数值 = {0}", "变量?");
                    new参数.Addparam(CS.变量2, "{0} = 结果", "变量?");
                    break;
                case "保留整数":
                    new参数.Addparam(CS.变量1, "数值 = {0}", "变量?");
                    new参数.Addparam(CS.变量2, "{0} = 结果", "变量?");
                    break;
                case "替换文字":
                    new参数.Addparam(CS.变量1, "文本 = {0}", "变量?");
                    new参数.Addparam(CS.文本1, "旧文字 = {0}", "旧");
                    new参数.Addparam(CS.文本2, "新文字 = {0}", "新");
                    new参数.Addparam(CS.数字1, "替换第 {0} 个", "0");
                    new参数.Addparam(CS.变量2, "{0} = 新文本", "变量?");
                    break;
                case "插入文字":
                    new参数.Addparam(CS.变量1, "文本 = {0}", "变量?");
                    new参数.Addparam(CS.变量2, "插入文字 = {0}", "变量?");
                    new参数.Addparam(CS.数字1, "插入位置 = {0}", "0");
                    new参数.Addparam(CS.变量3, "{0} = 新文本", "变量?");
                    break;
                case "删除文字":
                    new参数.Addparam(CS.变量1, "文本 = {0}", "变量?");
                    new参数.Addparam(CS.文本1, "要删除的文字 = {0}", "哈哈");
                    new参数.Addparam(CS.数字1, "删除第 {0} 个", "0");
                    new参数.Addparam(CS.变量2, "{0} = 新文本", "变量?");
                    break;
                case "获取文字位置":
                    new参数.Addparam(CS.变量1, "文本 = {0}", "变量?");
                    new参数.Addparam(CS.文本1, "要匹配的文字 = {0}", "哈哈");
                    new参数.Addparam(CS.数字1, "匹配第 {0} 个", "1");
                    new参数.Addparam(CS.变量2, "{0} = 匹配位置", "变量?");
                    break;
                case "读取文本文件":
                    new参数.Addparam(CS.变量1, "文件 = {0}", "C:\\文本.txt");
                    new参数.Addparam(CS.变量2, "{0} = 文件内容", "变量?");
                    break;
                case "屏蔽步骤":
                    new参数.Addparam(CS.数字1, "步骤 = {0}", "1");
                    new参数.Addparam(CS.布尔值, "解除屏蔽 = {0}", "0");
                    break;
                case "屏蔽步骤a":
                    new参数.Addparam(CS.数字1, "步骤 = {0}", "1");
                    new参数.Addparam(CS.时间, "{0}ms 后, 解除屏蔽", "1000");
                    break;
                case "重排步骤并执行":
                    new参数.Addparam(CS.文本1, "执行顺序 = {0}", "1,2,3,4,5");
                    break;
                case "切换窗口":
                    new参数.Addparam(CS.数字1, "目标窗口句柄 = {0}", "0");
                    break;
                case "截图":
                    new参数.Addparam(CS.区域, "区域 = {0}", "0,0,1920,1080");
                    new参数.Addparam(CS.变量1, "{0} = 图片", "变量?");
                    break;
                case "定时a":
                    new参数.Addparam(CS.时分, "时间 = {0}", "20:00");
                    new参数.Addparam(CS.前景色, "到达时，执行子方法", "");
                    break;
                case "定时b":
                    new参数.Addparam(CS.时间, "时间 = {0}", "2024/07/05 08:00");
                    new参数.Addparam(CS.前景色, "到达时，执行子方法", "");
                    break;
                case "时间计划":
                    new参数.Addparam(CS.代码, "前后执行间隔 {0} ms", "> 1000");
                    new参数.Addparam(CS.前景色, "则执行子方法", "");
                    new参数.Addparam(CS.布尔值, "否则重置 = {0}", "0");
                    new参数.Addparam(CS.布尔值2, "第一次时执行 = {0}", "1");
                    break;
                case "屏蔽键鼠":
                    new参数.Addparam(CS.前景色, "子方法执行时", "");
                    break;
                case "屏蔽移动":
                    new参数.Addparam(CS.前景色, "子方法执行时", "");
                    break;
                case "画圆":
                    new参数.Addparam(CS.半径, "半径 = {0}", "100");
                    new参数.Addparam(CS.长度, "长度 = {0}", "0");
                    new参数.Addparam(CS.时长, "总耗时 = {0} ms", "500");
                    new参数.Addparam(CS.角度, "起始角度 = {0}°", "90");
                    new参数.Addparam(CS.数字1, "顺时针 = {0}", "1");
                    new参数.Addparam(CS.数字2, "直线耗时 = {0} ms", "1");
                    break;
                case "时长统计":
                    new参数.Addparam(CS.时间, "{0} = 子方法执行时长", "变量?");
                    break;
                case "遍历读取":
                    new参数.Addparam(CS.变量1, "数组 = {0}", "变量?");
                    new参数.Addparam(CS.变量2, "索引 = {0}", "变量?");
                    new参数.Addparam(CS.变量3, "{0} = 索引元素", "变量?");
                    new参数.Addparam(CS.代码, "当遍历完成时：{0}", "0");
                    new参数.Addparam(CS.说明, "遍历时, 执行子方法", "");
                    break;
                case "遍历写入":
                    new参数.Addparam(CS.变量1, "数组 = {0}", "变量?");
                    new参数.Addparam(CS.变量2, "索引 = {0}", "变量?");
                    new参数.Addparam(CS.变量3, "索引元素 = {0}", "变量?");
                    new参数.Addparam(CS.代码, "当遍历完成时：{0}", "0");
                    new参数.Addparam(CS.说明, "遍历时, 执行子方法", "");
                    break;
                case "时间拦截":
                    new参数.Addparam(CS.说明, "自上一次拦截开始", "");
                    new参数.Addparam(CS.时间, "至少过去 {0} ms, 则放行", "50");
                    new参数.Addparam(CS.布尔值, "负时差累计 = {0}", "1");
                    new参数.Addparam(CS.布尔值2, "取反 = {0}", "0");
                    new参数.Addparam(CS.布尔值3, "重置 = {0}", "0");
                    break;
                case "时间筛查":
                    new参数.Addparam(CS.说明, "自上一次起点开始", "");
                    new参数.Addparam(CS.时间, "至少过去 {0} ms, 则执行子方法", "50");
                    new参数.Addparam(CS.布尔值, "起点 = {0}", "1");
                    break;
                case "预约方法":
                    new参数.Addparam(CS.方法名, "要预约的方法 = {0}", "方法名");
                    new参数.Addparam(CS.数字1, "第 {0} 次调用同名方法时,", "1");
                    new参数.Addparam(CS.尺寸, "插入当前队列前方", "");
                    new参数.Addparam(CS.前摇, "并且执行子方法", "");
                    new参数.Addparam(CS.循环变量1, "循环 = {0}", "0");
                    break;
                case "返回父级":
                    new参数.Addparam(CS.数字1, "返回层数 = {0}", "1");
                    new参数.Addparam(CS.布尔值, "停止循环 = {0}", "1");
                    break;
                case "跳过父级以及后续方法":
                    new参数.Addparam(CS.数字1, "返回层数 = {0}", "1");
                    new参数.Addparam(CS.布尔值, "停止循环 = {0}", "1");
                    break;
                case "窗口镜像":
                    new参数.Addparam(CS.窗口句柄, "窗口句柄 = {0}", "0");
                    new参数.Addparam(CS.区域, "窗口镜像区域 = {0}", "0,0,500,500");
                    new参数.Addparam(CS.坐标, "屏幕显示位置 = {0}", "800,400");
                    new参数.Addparam(CS.数字1, "缩放比例 = {0}", "0.5");
                    new参数.Addparam(CS.说明, "子方法结束时, 隐藏镜像窗口", "");
                    break;
                case "按住按键":
                    new参数.Addparam(CS.键盘按键, "按键 = {0}", "按下任意键");
                    break;
                case "弹起按键":
                    new参数.Addparam(CS.键盘按键, "按键 = {0}", "按下任意键");
                    break;
                case "弹起鼠标按键":
                    new参数.Addparam(CS.鼠标按键, "注册的鼠标按键 = {0}", "按下任意键");
                    break;
                case "按住鼠标按键":
                    new参数.Addparam(CS.鼠标按键, "注册的鼠标按键 = {0}", "按下任意键");
                    break;
                case "命令行":
                    new参数.Addparam(CS.代码, "{0}", "请输入CMD代码");
                    break;
                case "注销手柄":
                    new参数.Addparam(CS.说明, "注销手柄", "");
                    break;
                case "手柄A键":
                case "手柄B键":
                case "手柄X键":
                case "手柄Y键":
                case "手柄Up键":
                case "手柄Down键":
                case "手柄Left键":
                case "手柄Right键":
                case "手柄Back键":
                case "Start":
                case "LS":
                case "RS":
                case "LB":
                case "RB":
                case "Guide":
                    new参数.Addparam(CS.单击次数, "点击 = {0} 次", "1");
                    new参数.Addparam(CS.单击间隔, "点击间隔 = {0} ms", "100");
                    new参数.Addparam(CS.说明, "子方法结束时弹起", "");
                    break;
                case "LT":
                case "RT":
                    new参数.Addparam(CS.单击次数, "点击 = {0} 次", "1");
                    new参数.Addparam(CS.单击间隔, "点击间隔 = {0} ms", "100");
                    new参数.Addparam(CS.数字1, "按下深度 = {0}", "0.8");
                    new参数.Addparam(CS.数字2, "弹起位置 = {0}", "0");
                    new参数.Addparam(CS.说明, "子方法结束时弹起", "");
                    break;
                case "左摇杆X轴":
                case "右摇杆X轴":
                    new参数.Addparam(CS.数字1, "X1 = {0}", "-1 到 1");
                    new参数.Addparam(CS.数字2, "X2 = {0}", "-1 到 1");
                    new参数.Addparam(CS.说明, "子方法结束时回到X2位置", "");
                    break;
                case "右摇杆Y轴":
                case "左摇杆Y轴":
                    new参数.Addparam(CS.数字1, "Y1 = {0}", "-1 到 1");
                    new参数.Addparam(CS.数字2, "Y2 = {0}", "-1 到 1");
                    new参数.Addparam(CS.说明, "子方法结束时回到Y2位置", "");
                    break;
                default: //组合键
                    new参数.Addparam(CS.单击次数, "点击 = {0} 次", "1");
                    new参数.Addparam(CS.单击间隔, "点击间隔 = {0} ms", "100");
                    new参数.Addparam(CS.窗口句柄, "目标窗口句柄 = {0}", "0");
                    new参数.Addparam(CS.说明, "子方法结束时弹起", "");
                    break;
            }
            方法.参数 = new参数.Upparam(方法.参数);
        }
        private static void Addparam(this System.Collections.Generic.Dictionary<CS, _参数> 库参数, CS 索引, string 解释, string 默认值)
        {
            //检查新键
            if (!库参数.ContainsKey(索引))
                库参数.Add(索引, new());
            //检查新解释
            _数据库._参数 参数 = 库参数[索引];
            if (参数.解释 != 解释)
            {
                参数.解释 = 解释;
                参数.值 ??= 默认值;
            }
            参数.显示文本 = 参数.文本值合并();
        }
        private static System.Collections.Generic.Dictionary<CS, _参数> Upparam(this System.Collections.Generic.Dictionary<CS, _参数> newData, System.Collections.Generic.Dictionary<CS, _参数> sourceData)
        {
            foreach (var item in newData.Keys)
            {
                if (sourceData.ContainsKey(item))
                {
                    newData[item].值 = sourceData[item].值;
                }
            }
            return newData;
        }

        private static string? 上一个变量;
        public static void 变量数据()
        {
            if (数据库.当前变量 == null)
            {
                上一个变量 = null;
                UI刷新.清空数据列表();
                return;
            }
            else if (数据库.当前变量 == 上一个变量)
                return;
            上一个变量 = 数据库.当前变量;
            MainWindow mainw = MainWindow.This;
            UI刷新.清空数据列表();
            if (数据库.当前变量.取值(out _变量 变量))
            {
                mainw.变量类型下拉框.SelectionChanged -= mainw.变量类型下拉框_SelectionChanged;
                switch (变量.类型)
                {
                    case "数值":
                        mainw.数据输入框.替换文本(变量.值);
                        mainw.变量类型下拉框.Text = "数值";
                        break;
                    case "文本":
                        mainw.数据输入框.替换文本(变量.值);
                        mainw.变量类型下拉框.Text = "文本";
                        break;
                    case "图片":
                        List<MoyuBitmap> 图片 = 变量.图片;
                        if (图片.Count > 0)
                            mainw.数据输入框.覆盖图片(图片);
                        mainw.变量类型下拉框.Text = "图片";
                        break;
                    case "":
                        mainw.变量类型下拉框.Text = "";
                        break;
                }
                mainw.变量类型下拉框.SelectionChanged += mainw.变量类型下拉框_SelectionChanged;
            }
            else
            {
                MoyuControl.Msgbox($"当前变量\"{数据库.当前变量}\"数据已丢失, 将自动删除");
                数据库.当前变量.删除变量(数据库.当前变量.Get级别());
                if (数据库?.当前方案 != null)
                    数据库?.当前方案?.子变量.Remove(数据库.当前变量);
                if (数据库?.当前步骤 != null)
                    数据库?.当前步骤?.子变量.Remove(数据库.当前变量);
                数据库.子变量.Remove(数据库.当前变量);
                mainw.变量列表.Items.Remove(mainw.变量列表.SelectedItem);
                存档();
            }
        }

        public static void Up变量列表(this ItemCollection Tree控件)
        {
            foreach (var item in 获取变量列表())
                Tree控件.Add(new TreeViewItem { Header = item });
        }
        public static List<string> 获取变量列表()
        {
            List<string> 变量s =
            [
                //添加全局变量
                .. 数据库.子变量,
            ];
            //添加方案变量
            if (数据库.当前方案 == null)
                return 变量s;

            int starIndex = 变量s.Count;
            foreach (var 变量str in 数据库.当前方案.子变量)
                变量s.Add(变量str);
            遍历父方案(数据库.当前方案.父);
            void 遍历父方案(List<_方案> 方案s)
            {
                _方案 item = 方案s.FirstOrDefault();
                if (item != null)
                {
                    int Index = starIndex;
                    foreach (var 变量str in item.子变量)
                        变量s.Insert(Index++, 变量str);
                    遍历父方案(item.父);
                }
            }

            //添加步骤变量
            if (数据库.当前步骤 == null)
                return 变量s;
            foreach (var 变量 in 数据库.当前步骤.子变量)
                变量s.Add(变量);
            return 变量s;
        }
        public static async void 方案()
        {
            在监听参数.失去焦点 = true;
            TreeView 方案列表 = null;
            方案列表 = MainWindow.This.方案列表;
            MainWindow.This.方案列表.Items.Clear();
            方案列表数据.Clear();
            if (方案为空())
                return;
            方案列表Add(方案列表, 数据库.方案);
        }
        public static async void 步骤()
        {
            在监听参数.失去焦点 = true;
            TreeView 步骤列表 = MainWindow.This.步骤列表;
            MainWindow.This.步骤列表.Items.Clear();
            步骤列表数据.Clear();
            if (步骤为空())
                return;
            步骤列表Add(步骤列表, 数据库.当前方案.步骤);
        }
        public static void 方法()
        {
            在监听参数.失去焦点 = true;
            TreeView 方法列表 = MainWindow.This.方法列表;
            方法列表.Items.Clear();
            方法列表数据.Clear();
            if (方法为空())
                return;
            方法列表Add(方法列表, 数据库.当前步骤.方法);
            Moyuptr<_方法> moyuptr = new();
            下寻子项(数据库.当前步骤.方法.FirstOrDefault(), moyuptr, 1);
            方法列表数据[moyuptr].展开();
        }
        public static void 参数(层级 层级)
        {
            在监听参数.失去焦点 = true;
            MainWindow.This.参数列表.Items.Clear();
            System.Collections.Generic.Dictionary<CS, _参数> 参数;
            switch (层级)
            {
                case 层级.方法:
                    if (数据库.当前方法 == null)
                        return;
                    检查方法参数(数据库.当前方法);
                    参数 = 数据库.当前方法.参数;
                    break;
                case 层级.步骤:
                    if (数据库.当前步骤 == null)
                        return;
                    检查步骤参数(数据库.当前步骤);
                    参数 = 数据库.当前步骤.参数;
                    break;
                case 层级.方案:
                    if (数据库.当前方案 == null)
                        return;
                    检查方案参数(数据库.当前方案);
                    参数 = 数据库.当前方案.参数;
                    break;
                default:
                    检查全局参数();
                    参数 = 数据库.参数;
                    break;
            }
            刷新参数列表(参数);
        }
        public static void 变量()
        {
            在监听参数.失去焦点 = true;
            TreeView 变量列表 = MainWindow.This.变量列表;
            变量列表.Items.Clear();
            Up变量列表(变量列表.Items);
        }

        private static void 刷新参数列表(System.Collections.Generic.Dictionary<CS, _参数> 参数)
        {
            TreeView 参数列表 = MainWindow.This.参数列表;
            foreach (var 参 in 参数)
            {
                TreeViewItem viewItem = new()
                {
                    Header = string.Format(参.Value.解释, 参.Value.值)
                };
                参数列表.Items.Add(viewItem);
                ((TreeViewItem)参数列表.Items[^1]).Tag = 参.Value;
            }
        }
        public static async void 方法列表Add(ItemsControl Tree控件, List<_数据库._方案._步骤._方法> 方法组)
        {
            递归(方法组, Tree控件, null);
            void 递归(List<_方法> 方法items, ItemsControl 节点item, _方法 父方法item)
            {
                for (int 方法Index = 0; 方法Index < 方法items.Count; 方法Index++)
                {
                    var 对象 = 方法items[方法Index];
                    对象.Set节点数据(方法Index, 父方法item, out var 节点);
                    节点item.Items.Add(节点);
                    方法列表数据[节点] = 对象;
                    递归(对象.子, (TreeViewItem)节点item.Items[方法Index], 对象);
                }
            }
        }
        public static void 方案列表Add(ItemsControl Tree控件, List<_数据库._方案> 方案组)
        {
            递归(方案组, Tree控件, null);
            void 递归(List<_方案> 方案items, ItemsControl 节点item, _方案 父方案item)
            {
                for (int i = 0; i < 方案items.Count; i++)
                {
                    var 对象 = 方案items[i];
                    对象.Set节点数据(i, 父方案item, out var 节点);
                    节点item.Items.Add(节点);
                    方案列表数据[节点] = 对象;
                    递归(对象.子, (TreeViewItem)节点item.Items[i], 对象);
                }
            }
        }
        public static void 步骤列表Add(ItemsControl Tree控件, List<_数据库._方案._步骤> 步骤)
        {
            for (int i = 0; i < 步骤.Count; i++)
            {
                var 对象 = 步骤[i];
                对象.Set节点数据(i, null, out var 节点);
                节点.Header = 对象.名字 + (i + 1);
                Tree控件.Items.Add(节点);
                步骤列表数据[节点] = 对象;
            }
        }
        public static void 展开(this TreeViewItem? selectedItem)
        {
            if (selectedItem == null)
                return;
            Stack<TreeViewItem> treeViewItems = new Stack<TreeViewItem>();
            // 获取选中项的父级项  
            DependencyObject? parent = selectedItem?.Parent;
            while (parent != null)
            {
                if (parent is TreeViewItem treeViewItemParent)
                {
                    // 展开父级项
                    treeViewItems.Push(treeViewItemParent);
                }
                // 继续向上查找父级项
                if (!(parent is TreeViewItem item))
                    break;
                parent = item?.Parent;
            }
            // 展开父级项
            while (treeViewItems.TryPop(out var result))
                result.IsExpanded = true;
        }
        public static void 清空数据列表()
        {
            MainWindow form = MainWindow.This;
            form.数据输入框.TextChanged -= form.数据输入框_TextChanged;
            form.数据输入框.Document.Blocks.Clear();
            form.数据输入框.TextChanged += form.数据输入框_TextChanged;
        }
    }
}
